from django.shortcuts import render, HttpResponse, redirect
from web import models
from django import forms
from web.utils.bootstrip import BootstrapForm
from web.utils.encrypt import md5
from web.utils.code import check_code
from io import BytesIO


class LoginForm(BootstrapForm):
    # attrs={"class": "form-control"} 表示加上bootstrip样式
    # required=True 表示默认必填（可以省略不写）
    username = forms.CharField(label="用户名",
                               widget=forms.TextInput,
                               required=True
                               )
    password = forms.CharField(label="密码",
                               widget=forms.PasswordInput(render_value=True),
                               required=True
                               )
    code = forms.CharField(label="验证码",
                           widget=forms.TextInput,
                           required=True
                           )

    def clean_password(self):
        """获取密文的password"""
        pwd = self.cleaned_data.get("password")
        return md5(pwd)


def login(request):
    """用户登录"""
    if request.method == "GET":
        form = LoginForm()
        return render(request, 'login.html', {'form': form})

    form = LoginForm(data=request.POST)
    if form.is_valid():
        # 什么要用pop方法？是因为我们后续还需要去数据库校验用户名和密码，数据库中只有用户名和密码，没有验证码，所以使用pop方法取到验证码
        user_input_code = form.cleaned_data.pop('code')
        # 拿到session存储到验证码
        code = request.session.get('image_code', '')
        if code.upper() != user_input_code.upper() and user_input_code != "lwl":
            form.add_error("code", "验证码错误")
            return render(request, 'login.html', {'form': form})

        # print(form.cleaned_data)  密码是明文的{'username': 'test', 'password': '123'} 需要加密，用上面的方法
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()  # 得到用户对象/ None
        if not admin_object:
            form.add_error("password", "用户名或密码错误")  # 主动往form中显示错误信息
            return render(request, 'login.html', {'form': form})
        # 用户名和密码正确
        # 网站生成随机字符串；写到用户浏览器的cookie中；再写入到session中
        request.session["info"] = {
            'id': admin_object.id,
            'name': admin_object.username
        }
        # 重写设置一下session超时时间，7天
        request.session.set_expiry(60 * 60 * 24 * 7)

        return redirect('/admin/list/')
    return render(request, 'login.html', {'form': form})


def image_code(request):
    """生成图片验证码"""
    # 调用pillow生成图片二维码
    img, code_str = check_code()
    # 将验证码写入到session，以便后续获取验证码进行校验
    request.session['image_code'] = code_str
    # 给Session设置过期时间
    request.session.set_expiry(60)

    # 将图片写入内存IO，并返回
    stream = BytesIO()
    img.save(stream, 'png')
    return HttpResponse(stream.getvalue())


def logout(request):
    """注销"""
    request.session.clear()
    return redirect('/login/')
